And use it to create the drawing context with it.
Note that this doesn't yet have any effect and is all infrastructure
preparation work.
gsk_renderer_realize
gsk_renderer_unrealize
gsk_renderer_create_render_node
+gsk_renderer_get_gl_context
gsk_renderer_render
<SUBSECTION Standard>
GSK_IS_RENDERER
if (!gsk_gl_renderer_create_programs (self, error))
return FALSE;
+ gsk_renderer_set_gl_context (renderer, self->gl_context);
+
return TRUE;
}
if (self->gl_context == gdk_gl_context_get_current ())
gdk_gl_context_clear_current ();
+
+ gsk_renderer_set_gl_context (renderer, NULL);
}
static void
GskScalingFilter mag_filter;
GdkWindow *window;
+ GdkGLContext *gl_context;
GdkDrawingContext *drawing_context;
GskRenderNode *root_node;
GdkDisplay *display;
GSK_RENDERER_GET_CLASS (renderer)->unrealize (renderer);
+ g_warn_if_fail (priv->gl_context == NULL);
+
priv->is_realized = FALSE;
}
* gsk_renderer_render:
* @renderer: a #GskRenderer
* @root: a #GskRenderNode
- * @context: a #GdkDrawingContext
+ * @context: a #GdkDrawingContext using the context returned by
+ * gsk_renderer_get_gl_context() or %NULL if the renderer was created
+ * via gsk_renderer_create_fallback().
*
* Renders the scene graph, described by a tree of #GskRenderNode instances,
* using the given #GdkDrawingContext.
return priv->cairo_context;
}
+void
+gsk_renderer_set_gl_context (GskRenderer *renderer,
+ GdkGLContext *context)
+{
+ GskRendererPrivate *priv = gsk_renderer_get_instance_private (renderer);
+
+ g_set_object (&priv->gl_context, context);
+}
+
+/**
+ * gsk_renderer_get_gl_context:
+ * @renderer: a #GskRenderer
+ *
+ * Returns the GL context used by @renderer. The only use for using this
+ * function is to pass the result to gdk_window_begin_draw_frame().
+ *
+ * Returns: The GL context to use for creating drawing contexts
+ **/
+GdkGLContext *
+gsk_renderer_get_gl_context (GskRenderer *renderer)
+{
+ GskRendererPrivate *priv = gsk_renderer_get_instance_private (renderer);
+
+ return priv->gl_context;
+}
+
/**
* gsk_renderer_create_fallback:
* @renderer: a #GskRenderer
const graphene_rect_t *viewport,
cairo_t *cr);
+GDK_AVAILABLE_IN_3_90
+GdkGLContext * gsk_renderer_get_gl_context (GskRenderer *renderer);
GDK_AVAILABLE_IN_3_90
void gsk_renderer_render (GskRenderer *renderer,
GskRenderNode *root,
gboolean gsk_renderer_is_realized (GskRenderer *renderer);
+void gsk_renderer_set_gl_context (GskRenderer *renderer,
+ GdkGLContext *context);
GskRenderNode * gsk_renderer_get_root_node (GskRenderer *renderer);
GdkDrawingContext * gsk_renderer_get_drawing_context (GskRenderer *renderer);
cairo_t * gsk_renderer_get_cairo_context (GskRenderer *renderer);
if (renderer == NULL)
return;
- gtk_snapshot_init (&snapshot, renderer, region);
+ context = gdk_window_begin_draw_frame (window,
+ gsk_renderer_get_gl_context (renderer),
+ region);
+
+ gtk_snapshot_init (&snapshot,
+ renderer,
+ gdk_drawing_context_get_clip (context));
gtk_widget_snapshot (widget, &snapshot);
root = gtk_snapshot_finish (&snapshot);
- if (root == NULL)
- return;
-
- gtk_inspector_record_render (widget, renderer, window, region, root);
-
- context = gdk_window_begin_draw_frame (window, NULL, region);
+ if (root != NULL)
+ {
+ gtk_inspector_record_render (widget, renderer, window, region, root);
- gsk_renderer_render (renderer, root, context);
- gsk_render_node_unref (root);
+ gsk_renderer_render (renderer, root, context);
+ gsk_render_node_unref (root);
+ }
gdk_window_end_draw_frame (window, context);
}